package com.rpframework.module.common.act.api;

import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;

import org.slf4j.helpers.MessageFormatter;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.google.gson.Gson;
import com.rpframework.core.utils.SpringUtils;
import com.rpframework.module.common.act.CommonBaseAct;
import com.rpframework.module.common.pay.alipay.util.AlipayNotify;
import com.rpframework.module.common.pay.wxpay.util.WXpayCore;
import com.rpframework.module.common.springmvc.event.OrderPaySuccEvent;
import com.rpframework.module.common.springmvc.event.vo.OrderPaySuccVO;
import com.rpframework.utils.NumberUtils;

@Controller
@RequestMapping("/api/common/pay_notify")
public class PayNotifyApiAct extends CommonBaseAct {
	
	@SuppressWarnings("rawtypes")
	@RequestMapping("alipay")
	public @ResponseBody String alipayNotify(HttpServletRequest request) throws UnsupportedEncodingException {
		String ret = "";
		//获取支付宝POST过来反馈信息
		Map<String,String> params = new HashMap<String,String>();
		Map requestParams = request.getParameterMap();
		for (Iterator iter = requestParams.keySet().iterator(); iter.hasNext();) {
			String name = (String) iter.next();
			String[] values = (String[]) requestParams.get(name);
			String valueStr = "";
			for (int i = 0; i < values.length; i++) {
				valueStr = (i == values.length - 1) ? valueStr + values[i]
						: valueStr + values[i] + ",";
			}
			//乱码解决，这段代码在出现乱码时使用。如果mysign和sign不相等也可以使用这段代码转化
			//valueStr = new String(valueStr.getBytes("ISO-8859-1"), "gbk");
			params.put(name, valueStr);
		}
		//JUST TEST.
//		OrderPaySuccVO orderPaySuccVO = new OrderPaySuccVO();
//		orderPaySuccVO.setOrderNo("ddd");
//		orderPaySuccVO.setPayChannel("WX");
//		orderPaySuccVO.setSucc(true);
//		orderPaySuccVO.setRetInfo(new Gson().toJsonTree(params).getAsJsonObject());
//		SpringUtils.publishEvent(new OrderPaySuccEvent(orderPaySuccVO));
//		
		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以下仅供参考)//
		//商户订单号
		String out_trade_no = new String(request.getParameter("out_trade_no").getBytes("ISO-8859-1"),"UTF-8");
		//支付宝交易号

//		String trade_no = new String(request.getParameter("trade_no").getBytes("ISO-8859-1"),"UTF-8");

		//交易状态
		String trade_status = new String(request.getParameter("trade_status").getBytes("ISO-8859-1"),"UTF-8");

		//获取支付宝的通知返回参数，可参考技术文档中页面跳转同步通知参数列表(以上仅供参考)//

		if(AlipayNotify.verify(params)){//验证成功
			//////////////////////////////////////////////////////////////////////////////////////////
			//请在这里加上商户的业务逻辑程序代码

			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			double total_fee = NumberUtils.parseDouble(request.getParameter("total_fee"));
			
			OrderPaySuccVO orderPaySuccVO = new OrderPaySuccVO();
			orderPaySuccVO.setOrderId(out_trade_no);
			orderPaySuccVO.setPayChannel("ALIPAY");
			orderPaySuccVO.setSucc(true);
			orderPaySuccVO.setPrice(total_fee);
			orderPaySuccVO.setRetInfo(new Gson().toJsonTree(params).getAsJsonObject());
			
			if(trade_status.equals("TRADE_FINISHED")) {
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
				SpringUtils.publishEvent(new OrderPaySuccEvent(orderPaySuccVO));	
				//注意：
				//该种交易状态只在两种情况下出现
				//1、开通了普通即时到账，买家付款成功后。
				//2、开通了高级即时到账，从该笔交易成功时间算起，过了签约时的可退款时限（如：三个月以内可退款、一年以内可退款等）后。
			} else if (trade_status.equals("TRADE_SUCCESS")){
				//判断该笔订单是否在商户网站中已经做过处理
					//如果没有做过处理，根据订单号（out_trade_no）在商户网站的订单系统中查到该笔订单的详细，并执行商户的业务程序
					//如果有做过处理，不执行商户的业务程序
				SpringUtils.publishEvent(new OrderPaySuccEvent(orderPaySuccVO));
				//注意：
				//该种交易状态只在一种情况下出现——开通了高级即时到账，买家付款成功后。
			}

			//——请根据您的业务逻辑来编写程序（以上代码仅作参考）——z				
			ret = "success";	//请不要修改或删除

			//////////////////////////////////////////////////////////////////////////////////////////
		}else{//验证失败
			ret = "fail";
		}
		return ret;
	}
	
	@RequestMapping("wx")
	public @ResponseBody String wxNotify(@RequestBody String body,
			HttpServletRequest request) throws UnsupportedEncodingException {
		String ret = "<xml><return_code><![CDATA[{}]]></return_code> <return_msg><![CDATA[{}]]></return_msg></xml>";
		System.out.println(body);
		Map<String, String> retMap = WXpayCore.getRetMap(body);
		boolean retSuccess = WXpayCore.isRetSuccess(retMap);
		
		if(retSuccess) {
			double total_fee = NumberUtils.parseDouble(retMap.get("total_fee"));
			total_fee /= 100; //分转化为元
			
			//——请根据您的业务逻辑来编写程序（以下代码仅作参考）——
			OrderPaySuccVO orderPaySuccVO = new OrderPaySuccVO();
			String out_trade_no = retMap.get("out_trade_no");
			
			orderPaySuccVO.setPrice(total_fee);
			orderPaySuccVO.setOrderId(out_trade_no);
			orderPaySuccVO.setPayChannel("WX");
			orderPaySuccVO.setSucc(true);
			orderPaySuccVO.setRetInfo(new Gson().toJsonTree(retMap).getAsJsonObject());
			
			try {
				SpringUtils.publishEvent(new OrderPaySuccEvent(orderPaySuccVO));
				ret = MessageFormatter.format(ret, "SUCCESS", "OK");
			} catch (Exception e) {
				e.printStackTrace();
				ret = MessageFormatter.format(ret, "FAIL", e.getLocalizedMessage());
			}
			
		} else {
			ret = MessageFormatter.format(ret, "FAIL", "校验不通过!");
		}
		return ret;
	}
}
